﻿/*****************************************************************//**
 * \file   memxx_supplement.h
 * \brief  内存(memory)操作函数的补充
 * \brief  注意标准库中string.h中的memxxx相关函数也不以'\0'为结束。
 * \brief  或者说u8数组的一些操作
 *
 * \author CaiYunWei
 * \date   July 2024
 *********************************************************************/
#pragma once


#ifdef __cplusplus
extern "C" {
#endif

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>


 /**
 * 十六进制打印一段内存（u8数组）.
 *
 * \param needle 目标数组起始地址
 * \param number 要打印的长度
 */
void memPrint(const void* target, size_t number);



/**
 * 按字节反转一段内存.
 *
 * @param start 起始地址
 * @param end 结束地址
 * @note 如 0xF1 0xAB 0xCD 0xE1 反转后为 0xE1 0xCD 0xAB 0xF1
 */
void memReversalV1(const void* start, const void* end);

/**
 * 按字节反转一段内存.
 *
 * @param start 起始地址
 * @param number 要处理的长度
 * @note 如 0xF1 0xAB 0xCD 0xE1 反转后为 0xE1 0xCD 0xAB 0xF1
 */
void memReversalV2(const void* start, size_t number);


/**
 * @brief 在内存块中查找子块（类似 strstr，但处理二进制数据）
 * @param haystack  主内存块地址
 * @param hlen      主内存块长度
 * @param needle    子内存块地址
 * @param nlen      子内存块长度
 * @return 找到时返回子块首次出现的地址，未找到返回 NULL
 */
const void* memmem(const void* haystack, size_t hlen, const void* needle, size_t nlen);

/**
 * @brief 在内存块中查找子块KMP操作（类似 strstr，但处理二进制数据）
 * @param haystack  主内存块地址
 * @param hlen      主内存块长度
 * @param needle    子内存块地址
 * @param nlen      子内存块长度
 * @return 找到时返回子块首次出现的地址，未找到返回 NULL
 */
const void* memmem_KMP(const void* haystack, size_t hlen, const void* needle, size_t nlen);


#ifdef __cplusplus
}
#endif